import {
    arrayMethods
} from "./array";
import defineReactive from "./defineReactive";
import {
    def
} from "./utils";
import observe from './obseve.js'
import Dep from "./Dep";

/** 构造一个Observer类，给实例添加__ob__属性，值是这次new的实例，并再次遍历调用defineReactive */
export default class Observer {
    constructor(value) {
        // 6.每一个Observer类的身上，都有一个dep(只要是对象就会有dep)
        this.dep = new Dep()

        // 1.给实例（this，一定要注意，构造函数中的this知道的是实例）添加__ob__属性，值是这次new的实例
        def(value, '__ob__', this, false)
        console.log('我是Observer构造器', value);
        // 2.不要忘记初心，Obesrver类的目的是：讲一个正常的object转换为每个层级的属性都是响应式

        if (Array.isArray(value)) {
            // 4.如果是数组，强制将value(数组)的原型修改为自己定义的arrayMethods对象（定义了自己的七个数组修改方法）
            Object.setPrototypeOf(value, arrayMethods)
            this.observeArray(value)
        } else {
            this.walk(value)
        }
    }
    // 3.对象被代理
    walk(value) {
        for (let k in value) {
            defineReactive(value, k)
        }
    }
    // 5.数组的特殊遍历
    observeArray(arr) {
        for (let i = 0; i < arr.length; i++) {
            // 逐项进行observe
            observe(arr[i])
        }
    }

}